package com.jy.rhin.domain.document.filter;

import java.util.function.BiConsumer;
import java.util.function.Function;

/**
 * @author WeiQ
 * @date 2022/6/9 16:47
 * 文档验证过滤器链路上下文
 */
public class DocumentFilterContext {
    private DocumentFilterContext() {
    }

    private static final ThreadLocal<DocumentFilterContextData> THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 初始化上下文 在文档提交/注册时先进行初始化，设置一个空的对象
     */
    public static void init() {
        THREAD_LOCAL.set(new DocumentFilterContextData());
    }

    /**
     * 设置上下文缓存对象的字段值 通过调用init方法初始化对象的set方法，将value值保存到上下文
     *
     * @param setter
     * @param value
     * @param <T>
     */
    public static <T> void set(BiConsumer<DocumentFilterContextData, T> setter, T value) {
        setter.accept(THREAD_LOCAL.get(), value);
    }

    /**
     * 从上下文获取指定字段的值 通过调用init方法初始化对象的get方法，获取value
     *
     * @param getter
     * @param <T>
     * @return
     */
    public static <T> T get(Function<DocumentFilterContextData, T> getter) {
        return getter.apply(THREAD_LOCAL.get());
    }

    /**
     * 清空上线文缓存对象 防止线程污染
     */
    public static void clear() {
        THREAD_LOCAL.remove();
    }

}
